package demo1;

//内部类
//1.静态内部类
//2.实例内部类
//3.匿名内部类
//4.局部内部类

class OutClass{
    public int data1=1;
    private int data2=2;
    public static int data3=3;

    //静态内部类
    //静态内部类当中，不能够直接访问外部类的非静态的数据成员，但是可以通过引用进行访问
    static class InnerClass{
        public int date4=4;
        public static int data5=5;
        private int data6=6;
        public void test(){
            OutClass outClass=new OutClass();
            //外部类的静态的数据成员
            System.out.println(data3);
            System.out.println(outClass.data1);
            System.out.println("静态内部类的test()方法");
        }
    }
}
class OutClass2{
    public int data1=1;
    private int data2=2;
    public static int data3=3;

    //内部类
    class InnerClass2{
        public int data1=100;
        public int date4=4;
        public static int data5=5;
        private int data6=6;
        public void test(){
            //对于实例内部类来说，包含2个this，一个this是实力内部类自己的，一个是外部类名.this

            OutClass2 outClass2=new OutClass2();
            System.out.println(outClass2.data1);
            System.out.println(OutClass2.this.data1);

            System.out.println(data1);
            System.out.println(data1);
            System.out.println(data2);
            System.out.println("实例内部类的test()方法");

        }
    }
}

class Out{
    public void test(){
        System.out.println("test,hhhhh");
    }
}

interface IA{
    void test1();
}
public class Test {

    public static void main(String[] args) {
        //这个匿名内部类实现了IA接口,并且同时重写了test1这个方法
        IA ia= new IA(){
            @Override
            public void test1() {
                System.out.println("sasasass");
            }
        };
        ia.test1();
    }

    public static void main4(String[] args) {
        //匿名内部类(类没有名字)
        new Out(){
            @Override
            public void test() {
                System.out.println("wwwww");
            }
        }.test();
    }

    public static void testfunc1(){
        class Inner{
            //局部内部类（定义在方法中）
            public int data1;
            public void func(){
                System.out.println("func");
            }
        }
        Inner inner=new Inner();
        inner.func();
    }

    public static void main3(String[] args) {
        testfunc1();
    }

    public static void main2(String[] args) {
        //实例化一个实例内部类
        //实力内部类和就静态内部类的区别：实力内部类比静态内部类多了一个外部类对象
        OutClass2 outClass2=new OutClass2();
        //通过外部类引用的对象outClass2来调用内部类
        OutClass2.InnerClass2 innerClass2=outClass2.new InnerClass2();
        innerClass2.test();
    }
    public static void main1(String[] args) {
        //实例化一个静态内部类对象
        OutClass.InnerClass innerClass=new OutClass.InnerClass();
        innerClass.test();
        System.out.println(innerClass.date4);
    }
}
